parser grammar AnalizadorParser;

options {
  language = Java;
  tokenVocab = AnalizadorLexer;
  backtrack = true;
}

@header {
  package practpl.nueve;
}

@members {
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
     
     boolean autor_encontrado = false;
     int libros_abiertos =  0;
}


biblioteca : elementos;

elementos: 
  i=abre_etiqueta
    
  (elementos|ID+)+
     
  c=cierra_etiqueta 
    {  
      //Si se cierra la seccion libro y no se ha encontrado ningun autor, excepcion
      if (("libro".equals(c)) && (autor_encontrado == false)) {
        System.err.println("Error -> Un libro debe tener un AUTOR.");
        throw new RecognitionException();
      } 
      //Comprobar si las etiquetas de apertura y cierre coinciden
      if (!i.equals(c)){
        System.err.println("Error -> La etiqueta de cierre " + c + " NO coincide con la de apertura \"" + i);
        throw new RecognitionException(); 
      }
      if ((libros_abiertos == 0)) {
        autor_encontrado = false;
      }
     }
;

abre_etiqueta returns [String id=""] : AETIQUETA i=ID CETIQUETA  {id = $i.text; if ("autor".equals(id)) {   
																																					        autor_encontrado = true;
																																					      }
																																					      if ("libro".equals(id)) {
																																					        libros_abiertos++;
																																					      }
																																 };

cierra_etiqueta returns [String id=""] : AETIQUETACIERRE i=ID CETIQUETA {id = $i.text; if ("libro".equals(id)) {
			                                                                                    libros_abiertos--;
			                                                                                  }
                                                                         };